//
//  MMGOAuthViewModel.swift
//  MyMicroblog
//
//  Created by Mac on 17/1/6.
//  Copyright © 2017年 itcast. All rights reserved.
//

import UIKit
import SVProgressHUD

class MMGUserAccountViewModel: NSObject {

    // 持有账号信息, 视图模型处理数据逻辑需要使用
    var userAccountDTO:MMGUserAccountDTO?
    
    // 重写构造函数,从磁盘加载账号信息,只在执行构造方法的时候访问一次磁盘,此后不会再从磁盘加载
    override init() {
        super.init()
        
        userAccountDTO = self.loadUserInfoWithPath()
        
    }
    
    // 添加头像地址
    var headURL:URL? {
    
        return URL(string: (userAccountDTO?.avatar_large) ?? "")
    }
    
    // 添加令牌信息,用以判断是否已经保存过登录信息
    var access_token: String? {
    
        return userAccountDTO?.access_token
    }
    
    // 提供单例对象,使全局处理的是同一个账号,只提供一个账号的登录信息
    static let shared: MMGUserAccountViewModel = MMGUserAccountViewModel()
    
    /******************** 逻辑处理方法 ********************/
    
    // 判断是否登陆过
    var userLogin: Bool {
    
        if userAccountDTO?.access_token != nil && !isExpires {
            return true
        }
        return false
    }
    
    // 判断令牌是否过期
    var isExpires: Bool {
        // 满足当前日期比过期日期小,则表示没有过期
        if userAccountDTO?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending {
            
            return false
        }
        // 否则,就表示过期
        return true
    }

    // 从授权方获取令牌
    func loadUserToken(code:String, loadUserTokenFinished: @escaping (Bool) -> ()) {
        
        let urlString:String = urlToken
        let parameters: [String : Any] = ["client_id" : client_id,
                                          "client_secret" : client_secret,
                                          "grant_type" : "authorization_code",
                                          "code" : code,
                                          "redirect_uri" : redirect_uri]
        
        MMGNetworkTool.shared.request(Method: .MethodPost, urlString: urlString, parameters: parameters) { (responseObject, error) in
            
            if error != nil {
                
                loadUserTokenFinished(false)
                return
            }
            
            // 将获取的对象转换为字典,作为参数获取用户信息
            self.loadUserInfo(dict: responseObject as! [String : Any], loadUserInfoFinished: loadUserTokenFinished)
            }
            
        
    }
    
    // 根据令牌,获取用户信息
    private func loadUserInfo(dict: [String : Any], loadUserInfoFinished: @escaping (Bool) -> ()){
        
        // 取出字典中的元素,组成新的字典
        let urlString: String = urlUserInfo
        let parameters: [String : Any] = ["access_token" : dict["access_token"]!,
                                          "uid" : dict["uid"]!]
        MMGNetworkTool.shared.request(Method: .MethodGet, urlString: urlString, parameters: parameters){ (responseObject, error) in
            
            if error != nil{
                // 执行完成回调,失败回调
                loadUserInfoFinished(false)
                return
            }
            
            // 成功获取数据,将获取的数据转换为字典,与参数 dict 合并
            var responseDict = responseObject as! [String : Any]
            for (key,value) in dict {
                
                responseDict[key] = value
            }
            
            // 合并完毕之后转模型
            let userAccount:MMGUserAccountDTO = MMGUserAccountDTO(dict: responseDict)
            print(userAccount)
            self.saveUserInfo(userAccount: userAccount)
            
            self.userAccountDTO = userAccount
            // 执行完成回调,成功回调
            loadUserInfoFinished(true)
        }
    }
    
    // 从本地获取用户信息
    func loadUserInfoWithPath() -> MMGUserAccountDTO? {
        
        let account = NSKeyedUnarchiver.unarchiveObject(withFile: filePath!)
        
        if let userAccount = account as? MMGUserAccountDTO {
           
            return userAccount
        }
        return nil
    }
    
    //  以归档的方式存储用户信息
    private func saveUserInfo(userAccount: MMGUserAccountDTO) {
        
        NSKeyedArchiver.archiveRootObject(userAccount, toFile: filePath!)
    }
}
